/**
 * @file thread4.c
 * @brief 第一接近传感器监控线程实现
 * 
 * 该线程负责监控第一个接近传感器的状态。主要功能包括：
 * 1. 初始化GPIO接口，配置为输入模式
 * 2. 定期读取接近传感器的状态信号
 * 3. 更新全局传感器状态变量
 * 4. 提供传感器状态查询接口给其他线程使用
 * 5. 在程序退出时释放GPIO资源
 * 
 * @note 该线程是系统安全检测的重要组成部分，用于检测无人机周围环境
 * 
 * @author 伞控无人机项目组
 * @date 2023
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <time.h>
#include <pthread.h>
#include <stdint.h>
#include "thread4.h"
#include "proximity_sensor_common.h"

// 全局变量定义
proximity_sensor_handle_t g_proximity_sensor1_handle;

/**
 * @brief 获取接近传感器状态的函数（供其他线程调用）
 * 
 * @param state 保存传感器状态的结构体指针
 * @return int 成功返回0，失败返回负数
 */
int get_proximity_sensor_state(proximity_sensor_t *state)
{
    if (!state) {
        return -1;
    }
    
    // 使用通用模块获取状态
    proximity_sensor_state_t common_state;
    if (proximity_sensor_get_state(&g_proximity_sensor1_handle, &common_state) != 0) {
        return -2;
    }
    
    // 转换为兼容的数据结构
    state->sensor1_state = common_state.sensor_state;
    state->timestamp = common_state.timestamp;
    
    return 0;
}

/**
 * @brief 线程4函数实现 - 接近传感器监测
 * 
 * @param arg 线程参数（未使用）
 * @return void* 始终返回NULL
 */
void* thread4_function(void* arg) {
    (void)arg;
    
    LOG_INFO(LOG_TO_FILE, LOG_MODULE_PROX1, "线程4启动: 接近传感器1");

    // 初始化接近传感器
    if (proximity_sensor_init(&g_proximity_sensor1_handle, &PROXIMITY_SENSOR_1_CONFIG) != 0) {
        LOG_ERROR(LOG_TO_FILE, LOG_MODULE_PROX1, "初始化接近传感器1失败，线程4退出");
        return NULL;
    }

    // 启动监控线程
    void* result = proximity_sensor_monitor_thread(&g_proximity_sensor1_handle);
    
    // 清理资源
    proximity_sensor_cleanup(&g_proximity_sensor1_handle);
    
    LOG_INFO(LOG_TO_FILE, LOG_MODULE_PROX1, "线程4退出");
    return result;
}

/**
 * @brief 调试函数：手动测试GPIO状态
 * 
 * @return void
 */
void debug_proximity_sensor_gpio(void) {
    if (g_proximity_sensor1_handle.state.is_initialized) {
        proximity_sensor_debug_gpio(&g_proximity_sensor1_handle);
    } else {
        LOG_ERROR(LOG_TO_FILE, LOG_MODULE_PROX1, "接近传感器1未初始化，无法调试");
    }
}

void thread4_stop(void) {
    LOG_INFO(LOG_TO_FILE, LOG_MODULE_PROX1, "线程4停止中");
    proximity_sensor_stop(&g_proximity_sensor1_handle);
} 